字符串问题——去掉字符串中连续出现k个'0'的子串

题目:给定一个字符串str和一个整数k,如果str中正好有k个连续的’0’出现时,则把这k个连续的’0’删除,实现两个函数返回处理后的字符串。函数一删除字符串中的k个’0’后,这k个位置为空;函数二删除字符串中的k个’0’后,字符之间没有空位。。
例:
函数一需实现:
str=”A00B”,k=2,则返回”A B”。
str=”A0000B000”,k=3,则返回”A0000B “。
函数二需实现:
str=”A00B”,k=2,则返回”AB”。
str=”A0000B000”,k=3,则返回”A0000B”。

实现:
函数一

  1. 生成两个int型变量,count用于计算当前’0’的个数,start用于记录’0’开始的位置。初始化count=0,start=-1
  2. 如果cha==’0’,判断start是否为-1,如果为-1则说明前面没有’0’,将start设置为i;如果start不为1,则说明前面有’0’,start的位置不变。
  3. 如果cha!=’0’,则此时开始判断’0’的个数,count==k则应当删除这k个’0’,令这些位置的值cha[start++]=0。删除了后需要重置count用于重新统计’0’的个数,重置start为-1,因为是使用-1来判断前面是否还有’0’的。
  4. 既然把删除时机放在cha不为’0’的时候,当str尾出现’0’时,为了防止删除不彻底,需要在遍历完后,再检查一次count是否为k,若count==k则删除这k个末尾的’0’。

函数二

  1. 创建StringBuilder类型(线程安全的)对象sb,使用其append方法可以为字符串添加字符。
  2. 将除去k个’0’的其它字符全部添加到sb中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class DeleteKZero {
/**
* 函数一:
* 删除字符串中连续的k个'0',删除的位置为空,后面的字符没有向前移位
* @param str
* @param k 需要删除的'0'字符的个数
* @return 删除后的字符,删除的位置为空
*/
public static String deleteKZero1 (String str, int k) {
if (str == null || k < 1) {
return str;
}
char[] cha = str.toCharArray();
int count = 0; //记录'0'个数
int start = -1; //记录'0'开始的位置
for (int i = 0; i < str.length(); i++) {
if (cha[i] == '0') {
count++;
//如果start==-1说明前面没有0,将当前i设为start
//如果start!=-1,说明前面有0,start的位置不变,count++。
start = start == -1 ? start = i : start;
} else { //cha != '0',说明此时该判断0的个数了
if (count == k) { //删除k个'0'
while(count-- != 0) {
cha[start++] = 0; //数组删除没有移位,只是让数组的当前值为0
}
}
//重置count和start
count = 0;
start = -1;
}
}
if (count == k) {
while (count-- != 0) {
cha[start++] = 0;
}
}
return String.valueOf(cha);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 函数二:
* 删除字符串中连续的k个'0',删除的位置被后面的字符占用
* @param str
* @param k 需要删除的'0'字符的个数
* @return 删除后的字符
*/
public static String deleteKZero2(String str, int k) {
if (str == null || k < 1) {
return str;
}
StringBuilder sb = new StringBuilder(); //线程安全的
int count = 0;
int start = -1;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == '0') {
start = start == -1 ? i : start;
count++;
} else { //当前位置不为'0',开始判断count的个数,需不需要删'0
if (count != k) { //如果个数不为k,将这些'0'放到sb中
while(count-- != 0) {
sb.append('0');
}
}
sb.append(str.charAt(i)); //将非'0'的也放入sb中
count = 0;
start = -1;
}
}
if (count != k) {
while (count-- != 0) {
sb.append('0');
}
}
return sb.toString();
}
1
2
3
4
5
6
7
8
9
10
11
	//Test
public static void main(String[] args) {
String str1 = "A000B";
String str2 = "A0000B000";
int k = 3;
System.out.println("函数一:A000B删除3个'0'之后为:" + deleteKZero1(str1, k));
System.out.println("函数一:A000B000删除3个'0'之后为:" + deleteKZero1(str2, k));
System.out.println("函数二:A000B删除3个'0'之后为:" + deleteKZero2(str1, k));
System.out.println("函数二:A000B000删除3个'0'之后为:" + deleteKZero2(str2, k));
}
}